﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using UFPE.CIn.Abc.Primality.Util;

namespace FerramentaComparacao
{
    public partial class Resultado : Form
    {
        public Resultado(Dictionary<string, Pair<bool, long>> resultados)
        {
            InitializeComponent();

            GenerateGraph(resultados);
        }

        private void GenerateGraph(Dictionary<string, Pair<bool, long>> resultados)
        {
            int pos = 0;

            long minTempo = long.MaxValue;
            string minAlg = "";
            long maxTempo = 0;

            foreach (var item in resultados)
            {
                Label lbl = new Label();
                lbl.Text = item.Key;
                lbl.Location = new Point(5, pos += 30);
                lbl.Size = new Size(150, 20);
                lbl.BackColor = Color.Transparent;

                grpGrafico.Controls.Add(lbl);

                if (item.Value.Second < minTempo)
                {
                    minTempo = item.Value.Second;
                    minAlg = item.Key;
                }

                if (item.Value.Second > maxTempo)
                {
                    maxTempo = item.Value.Second;
                }
            }

            lblRapido.Text = minAlg;

            pos = 0;

            Font fonte = new Font(FontFamily.GenericSansSerif, 7);
            foreach (var item in resultados)
            {
                int tamanho = (maxTempo > 0) ? Convert.ToInt32(((double)item.Value.Second / (double)maxTempo) * 270) : 0;
                pos += 30;
                int posTemp = pos;
                Rectangle bar = new Rectangle(150, posTemp, tamanho, 20);
                long time = item.Value.Second;

                Brush trueOuFalse = item.Value.First ? Brushes.Green : Brushes.Red;

                grpGrafico.Paint += delegate(object o, PaintEventArgs e)
                {
                    e.Graphics.FillRectangle(trueOuFalse, bar);
                    e.Graphics.DrawString(String.Format("{0} ms", time), fonte, trueOuFalse, new PointF(tamanho + 150, posTemp + 3));
                };
            }
        }

        private void Resultado_FormClosed(object sender, FormClosedEventArgs e)
        {
            DialogResult resposta = MessageBox.Show("Deseja efetuar outro teste?", "Continuar?", MessageBoxButtons.YesNo);
            if (resposta == DialogResult.Yes)
            {
                System.Diagnostics.Process.Start(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
            }
            System.Diagnostics.Process.GetCurrentProcess().Kill();
        }
    }
}
